#!/usr/bin/env python
#-*- coding: utf-8 -*-

import sys
from os import sep # Separador de arquivos
from os import getcwd  # fun??o para saber o nome da pasta que o arquivo se encontra
from time import sleep
from os import path
import server
from threading import Thread



try:
    import pygtk
    pygtk.require('2.0')
except:
    pass                # Libs da biblioteca gr?fica
try:
    import gtk
    import gtk.glade
except:
    sys.exit(1)

CENTER = gtk.WIN_POS_CENTER
TEMP='arquivos'

class ServidorUrna(object):
    def __init__(self):
        print getcwd()+sep+'arquivos'+sep+'gui.glade'
                
        self.banco = server.BancoDados()
        

        self.xml = gtk.glade.XML(getcwd()+sep+'arquivos'+sep+'gui.glade')
        self.window1 = self.xml.get_widget('window1')
        self.window2 = self.xml.get_widget('window2')
        self.window3 = self.xml.get_widget('window3')
        self.text = self.xml.get_widget('textview')
        self.btnCancelarText = self.xml.get_widget('btnCancelText')
        
        self.notebook = self.xml.get_widget('notebook')
        self.status = self.xml.get_widget('status')
        
        self.btnTodosEleitores = self.xml.get_widget('btnTodosEleitores')
        self.btnVEleitor = self.xml.get_widget('btnVisualEleitor')
        self.btnIEleitor = self.xml.get_widget('btnInserirEleitor')
        self.buscarEleitor = self.xml.get_widget('entryBuscarEleitor')
        
        self.btnTodosPartidos = self.xml.get_widget('btnTodosPartidos')
        self.btnVPartido = self.xml.get_widget('btnVisualPartido')
        self.btnIPartido = self.xml.get_widget('btnInserirPartido')
        self.buscarPartido = self.xml.get_widget('entryBuscarPartido')
        
        self.btnTodosPoliticos = self.xml.get_widget('btnTodosPoliticos')
        self.btnVPolitico = self.xml.get_widget('btnVisualPolitico')
        self.btnIPolitico = self.xml.get_widget('btnInserirPolitico')
        self.buscarPolitico = self.xml.get_widget('entryBuscarPolitico')
        self.btnImagePolitico = self.xml.get_widget('btnImage')
        
        self.btnRefresh = self.xml.get_widget('btnRefresh')
        self.textResultado = self.xml.get_widget('textResultado')
        self.graph = self.xml.get_widget('graph')
        #dialogEleitor        
        self.dialogEleitor = self.xml.get_widget('dialogEleitor')
        self.btnOkEleitor = self.xml.get_widget('btnOkE')
        self.btnCancelarEleitor = self.xml.get_widget('btnCancelE')
        self.entryNomeEleitor = self.xml.get_widget('entryNomeE')
        self.entryCpfEleitor = self.xml.get_widget('entryCpfE')
        self.lbVotou = self.xml.get_widget('lbVotou')
        
        #dialogPartido
        self.dialogPartido = self.xml.get_widget('dialogPartido')
        self.btnOkPartido = self.xml.get_widget('btnOkPP')
        self.btnCancelarPartido = self.xml.get_widget('btnCancelPP')
        self.entryNomePartido = self.xml.get_widget('entryNomePP')
        self.entryNumeroPartido = self.xml.get_widget('entryNumeroPP')
        self.candidato = self.xml.get_widget('candidato')
        
        #dialogPolitico
        self.dialogPolitico = self.xml.get_widget('dialogPolitico')
        self.btnOkPolitico = self.xml.get_widget('btnOkPO')
        self.btnCancelarPolitico = self.xml.get_widget('btnCancelPO')
        self.entryNomePolitico = self.xml.get_widget('entryNomePO')
        self.entryNumeroPolitico = self.xml.get_widget('entryNumeroPO')
        self.lbVotos = self.xml.get_widget('lbVotos')
        self.btnOkImage = self.xml.get_widget('btnOkImage')
        
        #Callback
        self.window1.connect('delete_event',gtk.main_quit)
        
        self.btnIEleitor.connect('clicked',self.show_dialog,self.dialogEleitor)
        self.btnCancelarEleitor.connect('clicked',self.delete_dialog,self.dialogEleitor)
        
        self.btnIPartido.connect('clicked',self.show_dialog,self.dialogPartido)
        self.btnCancelarPartido.connect('clicked',self.delete_dialog,self.dialogPartido)
        
        self.btnIPolitico.connect('clicked',self.show_dialog,self.dialogPolitico)
        self.btnCancelarPolitico.connect('clicked',self.delete_dialog,self.dialogPolitico)
        self.btnImagePolitico.connect('clicked', self.show_image, self.dialogPolitico)
        self.btnOkImage.connect('clicked', self.btn_ok_image)
        
        self.btnTodosEleitores.connect('clicked',self.btn_show_text,self.banco.todos_eleitores())
        self.btnOkEleitor.connect('clicked',self.btn_ok_eleitor_callback)
        self.btnVEleitor.connect('clicked',self.btn_visualizar_eleitor_callback)
        
        self.btnTodosPartidos.connect('clicked',self.btn_show_text,self.banco.todos_partidos())
        self.btnOkPartido.connect('clicked',self.btn_ok_partido_callback)
        self.btnVPartido.connect('clicked',self.btn_visualizar_partido_callback)
        
        
        self.btnTodosPoliticos.connect('clicked',self.btn_show_text,self.banco.todos_politicos(" WHERE nome <> 'Branco' AND nome <> 'Nulo'"))
        self.btnOkPolitico.connect('clicked',self.btn_ok_politico_callback)
        self.btnVPolitico.connect('clicked',self.btn_visualizar_politico_callback)
        
        self.btnCancelarText.connect('clicked',self.delete_text)
        self.btnRefresh.connect('clicked',self.btn_refresh_callback)
        self.window1.set_position(CENTER)
        self.dialogEleitor.set_position(CENTER)
        self.dialogPolitico.set_position(CENTER)
        self.dialogPartido.set_position(CENTER)
        self.window2.set_position(CENTER)


        self.window1.set_title('Manager Database')
        self.window2.set_title('Manager Database')
        self.window1.set_resizable(False)
        self.window2.set_resizable(False)

        self.window3.set_position(CENTER)
        self.window1.set_title('Servidor')
        self.window1.show_all()
        self.textResultado.hide()
        
    def btn_refresh_callback(self,widget):
        self.textResultado.show()
        self.status.pop(0)
        
        try:
            resultado = self.banco.todos_politicos(' ORDER BY votos DESC')
            texto=''
            print resultado
            if resultado:
                for indice,nome,numero,votos in resultado:
                    texto += nome+' - '+ str(votos)+'\n'
                
                buffer = gtk.TextBuffer()
                buffer.set_text(texto)
                self.textResultado.set_buffer(buffer)
            self._create_graph(resultado)
        except Exception,e:
            self.status.push(0,"<ERROR> "+e.args[0])
    
    def _create_graph(self,data):
        try:
            import matplotlib.pyplot as plt
            from random import choice
            labels=[]
            x=[]
            explode=[]
            for id,nome,numero,votos in data:
               x.append(votos)
               #explode.append(choice([0.1,0]))
               labels.append(nome)
            plt.figure(figsize=(3,3))
            plt.pie(x,labels=labels,autopct='%1.1f%%')
            plt.savefig(TEMP+sep+'pie.png')
            self.graph.set_from_file(TEMP+sep+'pie.png')
        except:
            print 'Não possui matplotlib'
        
    
    def delete_text(self,widget,data=None):
        self.window2.hide()
        
    def btn_show_text(self,widget,data=None):
        
        self.window2.show_all()
        print data
        texto=''
        for tupla in data:
            texto+=' '+tupla[1]+' - '+tupla[2]+' \n'
        
        buffer = gtk.TextBuffer()
        buffer.set_text(texto)
        self.text.set_buffer(buffer)
        self.window2.show_all()
        
    def btn_visualizar_eleitor_callback(self,widget,data=None):

        cpf = self.buscarEleitor.get_text()
        self.status.pop(0)
        if cpf:
            try:
                lista = self.banco.buscar_eleitor(cpf)
                if lista:
                    lista=lista[0]
                
                    self.lbVotou.set_text('Sim' if lista[-1] else 'Não')
                    self.entryNomeEleitor.set_text(lista[1])
                    self.entryCpfEleitor.set_text(lista[2])
                    self.dialogEleitor.show()
                    self.btnOkEleitor.hide()
                else:
                    self.status.push(0,"<ERROR> Eleitor não encontrado")
            except Exception,e:
                self.status.push(0,"<ERROR> "+e.args[0])
                
        else:
            self.status.push(0,"<ERROR> "+"Informar um Cpf")
        
    def btn_ok_eleitor_callback(self,widget,data=None):
     
        self.status.pop(0)
        nome = self.entryNomeEleitor.get_text()
        cpf = self.entryCpfEleitor.get_text()
        
        if nome and cpf:
            try:
                self.banco.inserir_eleitor(nome,cpf)
            except Exception, e:
                print e
                self.status.push(0,e.args[0])
        else:
            self.status.push(0,"<ERROR> Nome ou Cpf Inválido")
            
        self.dialogEleitor.hide()
        self.window1.set_sensitive(True)
    
    def btn_visualizar_partido_callback(self,widget,data=None):
        numero = self.buscarPartido.get_text()
        self.status.pop(0)
        
        if numero:
            try:
                lista = self.banco.buscar_partido(numero)
                if lista:
                    lista = lista[0]
                    
                    self.entryNomePartido.set_text(lista[1])
                    self.entryNumeroPartido.set_text(lista[2])
                    self.dialogPartido.show()
                    self.btnOkPartido.hide()
                else:
                    self.status.push(0,"<ERROR> Partido não encontrado")
            except Exception,e:
                self.status.push(0,"<ERROR> "+e.args[0])
        else:
            self.status.push(0,"<ERROR> "+"Informar um número")
            
    def btn_ok_partido_callback(self,widget,data=None):
        self.status.pop(0)
        nome = self.entryNomePartido.get_text()
        numero = self.entryNumeroPartido.get_text()
        
        if nome and numero:
            try:
                self.banco.inserir_partido(nome,numero)
            except Exception,e:
                print e
                self.status.push(0,e.args[0])
        else:
            self.status.push(0,"<ERROR> Nome ou número inválido")
        self.dialogPartido.hide()
        self.window1.set_sensitive(True)
    
    def btn_ok_politico_callback(self,widget,data=None):
        self.status.pop(0)
        nome = self.entryNomePolitico.get_text()
        numero = self.entryNumeroPolitico.get_text()
        
        if nome and numero:
            try:
                self.banco.inserir_politico(nome,numero)
            except Exception,e:
                print e
                self.status.push(0,e.args[0])
        else:
            self.status.push(0,"<ERROR> Nome ou número inválido")
        self.dialogPolitico.hide()
        self.window1.set_sensitive(True)
        
    def btn_visualizar_politico_callback(self,widget,data=None):
        numero = self.buscarPolitico.get_text()
        self.status.pop(0)
        
        if numero:
            try:
                lista = self.banco.buscar_politico(numero)
                if lista:
                    lista = lista[0]
                    print lista
                    self.entryNomePolitico.set_text(lista[1])
                    self.entryNumeroPolitico.set_text(lista[2])
                    self.lbVotos.set_text(str(lista[3]))
                    self.dialogPolitico.show()
                    self.btnOkPolitico.hide()
                    self.btnImagePolitico.hide()
                else:
                    self.status.push(0,"<ERROR> Politico não encontrado")
            except Exception,e:
                self.status.push(0,"<ERROR> "+e.args[0])
        else:
            self.status.push(0,"<ERROR> "+"Informar um número")
    
    def delete_dialog(self,widget,dialog):
        self.window1.set_sensitive(True)
        dialog.hide()
       
        
    def show_dialog(self,widget,dialog):
        self.btnOkEleitor.show()
        self.btnOkPartido.show()
        self.btnOkPolitico.show()
        self.btnImagePolitico.show()
        self.entryCpfEleitor.set_text('')
        self.lbVotou.set_text('Não')
        self.entryNomePartido.set_text('')
        self.entryNumeroPartido.set_text('')
        self.entryNomeEleitor.set_text('')
        self.entryNomePolitico.set_text('')
        self.entryNumeroPolitico.set_text('')
        
        dialog.show()
        self.window1.set_sensitive(False)

    def show_image(self, widget, dialog):

        numero = self.entryNumeroPolitico.get_text()
        imagem = TEMP+sep+numero+'.jpg'

        if path.exists(imagem):
            self.candidato.set_from_file(imagem)

        self.window3.show()
        self.dialogPolitico.set_sensitive(False)

    def btn_ok_image(self,widget,data=None):
        self.window3.hide()
        self.dialogPolitico.set_sensitive(True)
    
    def main(self):
        gtk.main()


if __name__=="__main__":
    gui = ServidorUrna()
    gui.main()
    
    
    
    
